package com.electron.power.model.mod;

import java.nio.ByteBuffer;
import java.time.LocalDateTime;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import com.electron.power.common.Coding;
import com.electron.power.common.utils.CRCUtil;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.SwaggerDefinition;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * 数据格式 实例 字节数 定义 --数据头-- 55 1 帧头 数据头 03 1 功能码 0060 2 数据长度 --数据-- 1A2B3C4D5E 5
 * 设备 ID 数据 80 1 设备标识 --A 相数据：-- XXXX 32 电压 XXXX 32 电流 XXXX 32 有功功率 XXXX 32
 * 有功总电量 XXXX 32 功率因数 XXXX 32 二氧化碳排量 XXXX 32 温度 XXXX 32 频率 --B 相数据：与A项数据相同-- --C
 * 相数据：与A项数据相同-- --校验-- CRC 2 CRC 校验
 */
@Document(collection = "mod")
@Data
@ApiModel("收集数据")
@Slf4j
public class ModRoot {
	public static final int FRAME_HEAD_LENGTH = 1;
	public static final int FUNCTION_CODE_LENGTH = 1;
	public static final int DATA_LENGTH = 2;

	public static final int DEVICE_ID_LENGTH = 5;
	public static final int DEVICE_NO_LENGTH = 1;
	public static final int DEFAULT_DATA_LENGTH = 4;
	/**
	 * 根据文档中定义的常量.实际的数据长度可能有变化.
	 */
	public static final int DEFAULT_ALL_DATA_LENGTH = 96;
	public static final int CRC_LENGTH = 2;

	@Id
	@ApiModelProperty(value = "主键", example = "")
	private String id;

	@ApiModelProperty("数据头")
	private ModHead head;

	@ApiModelProperty("数据体")
	private ModBody body;

	private LocalDateTime creatTime;

	private LocalDateTime lastTime;

	public static Integer getHeadLenth() {
		return FRAME_HEAD_LENGTH + FUNCTION_CODE_LENGTH + DATA_LENGTH;
	}

	public static Integer getBodyLenth() {
		return DEVICE_ID_LENGTH + DEVICE_NO_LENGTH + DEFAULT_ALL_DATA_LENGTH + CRC_LENGTH;
	}

	public static Integer getFrameLenth() {
		return getHeadLenth() + getBodyLenth();
	}

	/**
	 * 
	 * @param orginData
	 * @return
	 */
	public static boolean validateCRC(final String orginData) {
		boolean result = false;
		String substring = orginData.substring(0, orginData.length() - 4);
		byte[] hex2byte = Coding.hex2byte(substring.getBytes());
		String caculateCRC = CRCUtil.getCRC(hex2byte);
		String orignCRC = orginData.substring(orginData.length() - 4);
		result = caculateCRC.equals(orignCRC);
		return result;
	}

	
}
